package action

import (
	"../global"
	"../model"
	"github.com/go-pg/pg"
	"github.com/labstack/echo"
	"strconv"
	"strings"
)

type Channel struct{}

//添加支付渠道
func (*Channel) Create(ctx echo.Context) (err error) {
	response := make(map[string]interface{})
	response["error"] = ""

	if ctx.FormValue("name") == "" {
		response["error"] = "支付渠道名称不能为空"
		return ctx.JSON(200, response)
	}
	if ctx.FormValue("code") == "" {
		response["error"] = "支付渠道代码不能为空"
		return ctx.JSON(200, response)
	}

	var others []model.Channel
	err = global.DB.Model(&others).Where("code=?", ctx.FormValue("code")).Select()
	if err != nil {
		global.Logger.Error("查询支付渠道出错：" + err.Error())
		response["error"] = ""
		return ctx.JSON(500, response)
	}
	if len(others) != 0 {
		response["error"] = "支付渠道代码已存在"
		return ctx.JSON(200, response)
	}

	var query model.Channel
	ID := global.IDNode.Generate()
	query.ID = ID.Int64()
	query.Name = ctx.FormValue("name")
	query.Code = ctx.FormValue("code")
	_, err = global.DB.Model(&query).Insert()
	if err != nil {
		global.Logger.Error("新增支付渠道出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	return ctx.JSON(200, response)
}

//获取所有支付渠道列表
func (*Channel) Index(ctx echo.Context) (err error) {
	response := make(map[string]interface{})
	response["error"] = ""

	var channels []model.Channel
	err = global.DB.Model(&channels).Select()
	if err != nil {
		global.Logger.Error("查询支付渠道出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	if len(channels) == 0 {
		response["data"] = ""
	} else {
		response["data"] = channels
	}
	return ctx.JSON(200, response)
}

//获取单个支付渠道数据
func (*Channel) Show(ctx echo.Context) (err error) {
	response := make(map[string]interface{})
	response["error"] = ""

	if ctx.Param("channel_id") == "" {
		response["error"] = "缺少参数channel_id"
		return ctx.JSON(200, response)
	}

	channel_id, err := strconv.ParseInt(ctx.Param("channel_id"), 10, 64)
	if err != nil {
		global.Logger.Error("channel_id数据类型转换出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}

	var channel model.Channel
	err = global.DB.Model(&channel).Where("id=?", channel_id).Select()
	if err != nil {
		global.Logger.Error("查找支付渠道出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	response["data"] = channel
	return ctx.JSON(200, response)
}

//修改单个支付渠道
func (*Channel) Edit(ctx echo.Context) (err error) {
	response := make(map[string]interface{})
	response["error"] = ""

	if ctx.Param("channel_id") == "" {
		response["error"] = "缺少参数channel_id"
		return ctx.JSON(200, response)
	}

	channel_id, err := strconv.ParseInt(ctx.Param("channel_id"), 10, 64)
	if err != nil {
		global.Logger.Error("channel_id数据类型转换出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	//查找出当前准备修改的支付渠道
	var channel model.Channel
	err = global.DB.Model(&channel).Where("id=?", channel_id).Limit(1).Select()
	if err != nil {
		global.Logger.Error("查询支付渠道出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	//定义修改模型
	var query model.Channel
	query.ID = channel.ID
	if ctx.FormValue("status") != "" && ctx.FormValue("status") == "true" {
		query.Status = true
	}
	if ctx.FormValue("name") != "" {
		query.Name = ctx.FormValue("name")
	} else {
		query.Name = channel.Name
	}
	if ctx.FormValue("code") != "" {
		query.Code = ctx.FormValue("code")
	} else {
		query.Code = channel.Code
	}
	//如果修改了code，查询是否有重复
	var others []model.Channel
	if query.Code != channel.Code {
		err = global.DB.Model(&others).Where("code=?", query.Code).Select()
		if err != nil {
			global.Logger.Error("查询支付渠道出错：" + err.Error())
			response["error"] = ""
			return ctx.JSON(500, response)
		}
		if len(others) != 0 {
			response["error"] = "支付代号不能重复"
			return ctx.JSON(200, response)
		}
	}
	//如果设定为可用，查询是否唯一可用
	if query.Status == true {
		err = global.DB.Model(&others).Where("status=?", true).Where("id!=?", query.ID).Select()
		if err != nil {
			global.Logger.Error("查询支付渠道出错：" + err.Error())
			response["error"] = ""
			return ctx.JSON(500, response)
		}
		if len(others) != 0 {
			response["error"] = "不能同时开启多个支付渠道"
			return ctx.JSON(200, response)
		}
	}
	//修改支付渠道
	_, err = global.DB.Model(&query).Where("id=?", query.ID).Set("name=?", query.Name).Set("code=?", query.Code).Set("status=?", query.Status).Update()
	if err != nil {
		global.Logger.Error("修改支付渠道错误：" + err.Error())
		response["error"] = "系统错误"
		return ctx.JSON(500, response)
	}
	return ctx.JSON(200, response)
}

//删除支付渠道
func (*Channel) Delete(ctx echo.Context) (err error) {
	response := make(map[string]interface{})
	response["error"] = ""

	if ctx.Param("channel_ids") == "" {
		response["error"] = "缺少支付渠道channel_ids字段"
		return ctx.JSON(200, response)
	}
	var deleteIDs []int64
	var stringIDs []string
	ids := ctx.Param("channel_ids")
	stringIDs = strings.Split(ids, ",")
	for _, v := range stringIDs {
		id, err := strconv.ParseInt(v, 10, 64)
		if err != nil {
			global.Logger.Error("channel_ids数据类型转换出错")
			response["error"] = "系统错误"
			return ctx.JSON(500, response)
		}
		deleteIDs = append(deleteIDs, id)
	}
	//判断支付渠道是否存在
	var channel_ids []model.Channel
	err = global.DB.Model(&channel_ids).Column("id", "status").WhereIn("id IN (?)", pg.In(deleteIDs)).Select()
	if err != nil {
		global.Logger.Error("查找支付渠道ID出错：" + err.Error())
		response["error"] = "系统错误"
		return ctx.String(500, err.Error())
	}
	if len(channel_ids) != len(deleteIDs) {
		response["error"] = "参数中含有不存在的支付渠道ID"
		return ctx.JSON(200, response)
	}

	//判断有没有状态是可用的
	for _, v := range channel_ids {
		if v.Status == true {
			response["error"] = "不能直接删除可用状态的支付渠道"
			return ctx.JSON(200, response)
		}
	}

	//判断需要删除的支付渠道的长度，分别删除
	if len(deleteIDs) > 1 {
		_, err = global.DB.Model(&model.Channel{}).WhereIn("id in (?)", pg.In(deleteIDs)).Delete()
		if err != nil {
			global.Logger.Error("删除支付渠道：" + err.Error())
			response["error"] = "系统错误"
			return ctx.String(500, err.Error())
		}
	} else {
		_, err = global.DB.Model(&model.Channel{}).Where("id=?", deleteIDs[0]).Delete()
		if err != nil {
			global.Logger.Error("删除支付渠道：" + err.Error())
			response["error"] = "系统错误"
			return ctx.String(500, err.Error())
		}
	}

	return ctx.JSON(200, response)
}
